<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app"></div>
</body>
<script src="../js/react.development.js"></script>
<script src="../js/react-dom.development.js"></script>
<script src="../js/babel.min.js"></script>
<script type="text/babel">
    // 定义类式组件
    class MyComponent extends React.Component {
        // 给自定义组件添加构造器方法
        constructor(props) {
            // 添加super
            super(props)
            // 初始化state
            this.state = {
                isHot: false
            }
            // 在构造器中通过bind改变changeIsHot方法中的this指向
            // 这里定义的changeIsHot添加在了类的本身对象上
            this.changeIsHot = this.changeIsHot.bind(this)
        }
        render() {
            console.log(this);
            // 从状态中读取isHot属性
            const { isHot } = this.state
            // 1.根据属性值判断显示是否炎热
            // 2.React重写了所有原生的onxxx方法，on后面的第一个单词要大写
            // 3.onClick触发的方法并不是类的原型上的方法，而是类本身定义的方法，也就是在构造器函数中定义的方法
            return <h2 onClick={this.changeIsHot}>今天的天气很{isHot ? '炎热' : '凉爽'} </h2>
        }
        // 添加事件方法，这里的方法添加在了类的原型上
        changeIsHot() {
            /*
                这里的this是undefined，因为React在编译虚拟DOM时找到了这个方法然后赋值给了onClick作为回调函数,
                我们通过点击h2标签触发这个方法时不是通过组件的示例化对象来触发的，而是直接触发的这个方法,又因为
                这个方法定义在类中，类中的方法默认都是严格模式，并且babel自身也是严格模式,
                所以这里的this是undefined
            */
            console.log(this);
        }
    }
    ReactDOM.render(<MyComponent />, document.getElementById("app"))
</script>

</html>